package com.grupobbva.seguridad.client.util;

import java.util.Collection;
import java.util.Map;

import javax.faces.context.FacesContext;

import org.primefaces.component.menuitem.MenuItem;
import org.primefaces.component.submenu.Submenu;
import org.primefaces.model.DefaultMenuModel;
import org.primefaces.model.MenuModel;

import com.grupobbva.seguridad.client.domain.Opcion;

public class UtilPrimeFaces {
	
	/******************************************************************************
	 * MENU PRIMEFACES
	 ******************************************************************************/
	public static MenuModel generarMenuModelPrimefacesPrueba(Map opciones) {
		Collection<Opcion> lista = opciones.values();		
		
		MenuModel model = new DefaultMenuModel();  
        
        //First submenu  
        Submenu submenu = new Submenu();  
        submenu.setLabel("Dynamic Submenu 1");  
          
        MenuItem item = new MenuItem();  
        item.setValue("Dynamic Menuitem 1.1");  
        item.setUrl("#");
        submenu.getChildren().add(item);  
          
        model.addSubmenu(submenu);  
          
        //Second submenu  
        submenu = new Submenu();  
        submenu.setLabel("Dynamic Submenu 2");  
          
        item = new MenuItem();  
        item.setValue("Dynamic Menuitem 2.1");  
        item.setUrl("#");  
        submenu.getChildren().add(item);  
                
        item = new MenuItem();  
        item.setValue("Dynamic Menuitem 2.2");  
        item.setUrl("#");  
        submenu.getChildren().add(item);
        
        Submenu subItem = new Submenu();  
        subItem.setLabel("Dynamic Submenu 2.3");
        
        item = new MenuItem();  
        item.setValue("Dynamic Menuitem 2.3.1");  
        item.setUrl("#");  
        subItem.getChildren().add(item);
        
        submenu.getChildren().add(subItem);
          
        model.addSubmenu(submenu);
        
        return model;
	}
	
	public static MenuModel generarMenuModel(Map opciones) {
		MenuModel model = new DefaultMenuModel();
		
		Collection<Opcion> opcionesAll = opciones.values();
		
		//Obtenemos las opciones del 1er nivel
		for (Opcion opcion : opcionesAll) {
			if(opcion.getNivel() == 1) {
				if (opcion.getTipoId() == Constante.TD_OPCION_SUBMENU) {
					Submenu submenu = new Submenu();
					submenu.setId("seggap_opc_mnu"+opcion.getOpcionId()+"_item");
		        	submenu.setLabel(opcion.getNombre());
					submenu.setInView(true);
		        	model.addSubmenu(submenu);
		        	System.out.println("Sub Opcion Generada: " + submenu.getId());
		        	generarSubOpciones(submenu, opcion, opcionesAll);
				} else {
					MenuItem itemSubmenu = new MenuItem();  
					itemSubmenu.setId("seggap_opc_mnu"+opcion.getOpcionId()+"_item");
					itemSubmenu.setValue(opcion.getNombre());
					String url = opcion.getUrl();
					if (url != null && url.length() > 2 && url.startsWith("#{") && url.endsWith("}")) {
						itemSubmenu.setAction(FacesContext.getCurrentInstance().getApplication().createMethodBinding(url, new Class[]{}));
						itemSubmenu.setAjax(false);
						itemSubmenu.setInView(true);
					} else {
						itemSubmenu.setUrl(opcion.getUrl());
						itemSubmenu.setInView(true);
					}
		        	model.addMenuItem(itemSubmenu);
				}
			}
		}
		
		return model;
	}
	public static void generarSubOpciones(Submenu submenu, Opcion opcion, Collection<Opcion> opciones) {
		for (Opcion subOpcion : opciones) {
			if(subOpcion.getOpcionPadreId() == opcion.getOpcionId()) {
				if (subOpcion.getTipoId() == Constante.TD_OPCION_SUBMENU) {
					Submenu subSubmenu = new Submenu();
					subSubmenu.setId("seggap_opc_mnu"+subOpcion.getOpcionId()+"_item");
					subSubmenu.setLabel(subOpcion.getNombre());
					submenu.getChildren().add(subSubmenu);
					submenu.setInView(true);
					
			        System.out.println("Sub Opcion Generada: " + subSubmenu.getId());
					
					generarSubOpciones(subSubmenu, subOpcion, opciones);
				} else {
					MenuItem itemSubmenu = new MenuItem();  
					itemSubmenu.setId("seggap_opc_mnu"+subOpcion.getOpcionId()+"_item");
					itemSubmenu.setValue(subOpcion.getNombre());
					String url = subOpcion.getUrl();
					if (url != null && url.length() > 2 && url.startsWith("#{") && url.endsWith("}")) {
						/*
						FacesContext context = FacesContext.getCurrentInstance();
						ELContext elctx = context.getELContext();
						ExpressionFactory elFactory = context.getApplication().getExpressionFactory();
						MethodExpression methodExpression = elFactory.createMethodExpression(elctx,url,null,new Class[]{});;
						itemSubmenu.setActionExpression(methodExpression);
						*/
						itemSubmenu.setAction(FacesContext.getCurrentInstance().getApplication().createMethodBinding(url, new Class[]{}));
						itemSubmenu.setAjax(false);
						itemSubmenu.setInView(true);
					} else {
						itemSubmenu.setUrl(subOpcion.getUrl());
						itemSubmenu.setInView(true);
					}
					submenu.getChildren().add(itemSubmenu);
					
			        System.out.println("Opcion Generada: " + itemSubmenu.getId());  
				}
			}
		}
	}
}
